﻿/*
# -*- coding: utf-8 -*-
# 注意：

# 若希望将本代码用于商业用途，需先联系作者并获得明确授权。
# 作者不对因使用本代码引发的任何直接或间接损失负责。
# 如有违反上述条款的行为，作者保留追究法律责任的权利。

# 免责声明：
# 请尊重知识产权，遵循相关法律法规。

# Notice:
# If you wish to use this code for commercial purposes, you must contact the author and obtain explicit authorization.
# The author is not responsible for any direct or indirect losses caused by the use of this code.
# If any of the above terms are violated, the author reserves the right to pursue legal action.
# Disclaimer:
# Please respect intellectual property rights and comply with relevant laws and regulations.

# Внимание:
# Если вы хотите использовать этот код в коммерческих целях, вам необходимо связаться с автором и получить явное разрешение.
# Автор не несет ответственности за любые прямые или косвенные убытки, возникшие в результате использования этого кода.
# В случае нарушения вышеуказанных условий автор оставляет за собой право на юридическое преследование.
# Отказ от ответственности:
# Пожалуйста, уважайте интеллектуальную собственность и соблюдайте соответствующие законы и нормативные акты.

# Attention :
# Si vous souhaitez utiliser ce code à des fins commerciales, vous devez contacter l'auteur et obtenir une autorisation explicite.
# L'auteur n'est pas responsable des pertes directes ou indirectes causées par l'utilisation de ce code.
# En cas de violation des conditions ci-dessus, l'auteur se réserve le droit de poursuivre une action en justice.
# Avertissement :
# Veuillez respecter les droits de propriété intellectuelle et vous conformer aux lois et réglementations en vigueur.

# 注意：

# 若希望将本代码用于商业用途，需先联系作者并获得明确授权。
# 作者不对因使用本代码引发的任何直接或间接损失负责。
# 如有违反上述条款的行为，作者保留追究法律责任的权利。

# 免责声明：
# 请尊重知识产权，遵循相关法律法规。

# Notice:
# If you wish to use this code for commercial purposes, you must contact the author and obtain explicit authorization.
# The author is not responsible for any direct or indirect losses caused by the use of this code.
# If any of the above terms are violated, the author reserves the right to pursue legal action.
# Disclaimer:
# Please respect intellectual property rights and comply with relevant laws and regulations.

# Внимание:
# Если вы хотите использовать этот код в коммерческих целях, вам необходимо связаться с автором и получить явное разрешение.
# Автор не несет ответственности за любые прямые или косвенные убытки, возникшие в результате использования этого кода.
# В случае нарушения вышеуказанных условий автор оставляет за собой право на юридическое преследование.
# Отказ от ответственности:
# Пожалуйста, уважайте интеллектуальную собственность и соблюдайте соответствующие законы и нормативные акты.

# Attention :
# Si vous souhaitez utiliser ce code à des fins commerciales, vous devez contacter l'auteur et obtenir une autorisation explicite.
# L'auteur n'est pas responsable des pertes directes ou indirectes causées par l'utilisation de ce code.
# En cas de violation des conditions ci-dessus, l'auteur se réserve le droit de poursuivre une action en justice.
# Avertissement :
# Veuillez respecter les droits de propriété intellectuelle et vous conformer aux lois et réglementations en vigueur.

# 注意：

# 若希望将本代码用于商业用途，需先联系作者并获得明确授权。
# 作者不对因使用本代码引发的任何直接或间接损失负责。
# 如有违反上述条款的行为，作者保留追究法律责任的权利。

# 免责声明：
# 请尊重知识产权，遵循相关法律法规。

# Notice:
# If you wish to use this code for commercial purposes, you must contact the author and obtain explicit authorization.
# The author is not responsible for any direct or indirect losses caused by the use of this code.
# If any of the above terms are violated, the author reserves the right to pursue legal action.
# Disclaimer:
# Please respect intellectual property rights and comply with relevant laws and regulations.

# Внимание:
# Если вы хотите использовать этот код в коммерческих целях, вам необходимо связаться с автором и получить явное разрешение.
# Автор не несет ответственности за любые прямые или косвенные убытки, возникшие в результате использования этого кода.
# В случае нарушения вышеуказанных условий автор оставляет за собой право на юридическое преследование.
# Отказ от ответственности:
# Пожалуйста, уважайте интеллектуальную собственность и соблюдайте соответствующие законы и нормативные акты.

# Attention :
# Si vous souhaitez utiliser ce code à des fins commerciales, vous devez contacter l'auteur et obtenir une autorisation explicite.
# L'auteur n'est pas responsable des pertes directes ou indirectes causées par l'utilisation de ce code.
# En cas de violation des conditions ci-dessus, l'auteur se réserve le droit de poursuivre une action en justice.
# Avertissement :
# Veuillez respecter les droits de propriété intellectuelle et vous conformer aux lois et réglementations en vigueur.

# 注意：

# 若希望将本代码用于商业用途，需先联系作者并获得明确授权。
# 作者不对因使用本代码引发的任何直接或间接损失负责。
# 如有违反上述条款的行为，作者保留追究法律责任的权利。

# 免责声明：
# 请尊重知识产权，遵循相关法律法规。

# Notice:
# If you wish to use this code for commercial purposes, you must contact the author and obtain explicit authorization.
# The author is not responsible for any direct or indirect losses caused by the use of this code.
# If any of the above terms are violated, the author reserves the right to pursue legal action.
# Disclaimer:
# Please respect intellectual property rights and comply with relevant laws and regulations.

# Внимание:
# Если вы хотите использовать этот код в коммерческих целях, вам необходимо связаться с автором и получить явное разрешение.
# Автор не несет ответственности за любые прямые или косвенные убытки, возникшие в результате использования этого кода.
# В случае нарушения вышеуказанных условий автор оставляет за собой право на юридическое преследование.
# Отказ от ответственности:
# Пожалуйста, уважайте интеллектуальную собственность и соблюдайте соответствующие законы и нормативные акты.

# Attention :
# Si vous souhaitez utiliser ce code à des fins commerciales, vous devez contacter l'auteur et obtenir une autorisation explicite.
# L'auteur n'est pas responsable des pertes directes ou indirectes causées par l'utilisation de ce code.
# En cas de violation des conditions ci-dessus, l'auteur se réserve le droit de poursuivre une action en justice.
# Avertissement :
# Veuillez respecter les droits de propriété intellectuelle et vous conformer aux lois et réglementations en vigueur.

# 注意：

# 若希望将本代码用于商业用途，需先联系作者并获得明确授权。
# 作者不对因使用本代码引发的任何直接或间接损失负责。
# 如有违反上述条款的行为，作者保留追究法律责任的权利。

# 免责声明：
# 请尊重知识产权，遵循相关法律法规。

# Notice:
# If you wish to use this code for commercial purposes, you must contact the author and obtain explicit authorization.
# The author is not responsible for any direct or indirect losses caused by the use of this code.
# If any of the above terms are violated, the author reserves the right to pursue legal action.
# Disclaimer:
# Please respect intellectual property rights and comply with relevant laws and regulations.

# Внимание:
# Если вы хотите использовать этот код в коммерческих целях, вам необходимо связаться с автором и получить явное разрешение.
# Автор не несет ответственности за любые прямые или косвенные убытки, возникшие в результате использования этого кода.
# В случае нарушения вышеуказанных условий автор оставляет за собой право на юридическое преследование.
# Отказ от ответственности:
# Пожалуйста, уважайте интеллектуальную собственность и соблюдайте соответствующие законы и нормативные акты.

# Attention :
# Si vous souhaitez utiliser ce code à des fins commerciales, vous devez contacter l'auteur et obtenir une autorisation explicite.
# L'auteur n'est pas responsable des pertes directes ou indirectes causées par l'utilisation de ce code.
# En cas de violation des conditions ci-dessus, l'auteur se réserve le droit de poursuivre une action en justice.
# Avertissement :
# Veuillez respecter les droits de propriété intellectuelle et vous conformer aux lois et réglementations en vigueur.

 */
using System;
using System.Collections;
using MyGame;
using UnityEngine;
using UnityEngine.UI;

namespace Game
{
    public class GamePlayPanel : ShowHidable
    {
    

        [SerializeField] private Button _previousBtn, _nxtBtn, _undoBtn;
        [SerializeField] private Text _lvlTxt;
        [SerializeField] private RectTransform _moreContent;
        [SerializeField] private float _moreContentExpandHeight;
        [SerializeField] private Animator _symmetricAnim;
        private string videoAdid = "24762k6e5mh6cc46h6";

        private LevelManager LevelManager => LevelManager.Instance;

        public RectTransform SymmetricGroup => (RectTransform) _symmetricAnim.transform;


        private int CurrentLevel
        {
            set
            {
                _lvlTxt.text = $"关卡 {value}";
                RefreshBtns();
            }
        }

        private GameBoard _board;

        private bool _showingMoreContent;
//        private int _currentSymmetricCount=0;

        public bool DisableButtons { get; set; } = false;

//        private int CurrentSymmetricCount
//        {
//            get => _currentSymmetricCount;
//            set
//            {
//                _symmetricTxt.text = $"{value}/{LevelManager.Level.SymmetricCount}";
//                if(value!=_currentSymmetricCount)
//                {
//                    _symmetricAnim.SetTrigger(_currentSymmetricCount>value?SYMMETRIC_DOWN_HASH: Board.Completed?COMPLETE_HASH : SYMMETRIC_UP_HASH);
//                }
//
//                _currentSymmetricCount = value;
//            }
//        }

        private bool ShowingMoreContent
        {
            get => _showingMoreContent;
            set
            {
                StopCoroutine(nameof(MoreContentSizeAnim));
                StartCoroutine(MoreContentSizeAnim(value ? _moreContentExpandHeight : 0));
                _showingMoreContent = value;
            }
        }

        private GameBoard Board
        {
            get => _board;
            set
            {
                if (value == null || value == _board)
                    throw new NotImplementedException();

                _board = value;
            }
        }


        private void Awake()
        {
            _previousBtn.onClick.AddListener(OnClickPrevious);
            _nxtBtn.onClick.AddListener(OnClickNxt);
        }


        protected override void OnEnable()
        {
            LevelManager.LevelLoaded += LevelManagerOnLevelLoaded;
            LevelManager.LevelCompleted += LevelManagerOnLevelCompleted;
            base.OnEnable();
        }


        protected override void OnDisable()
        {
            LevelManager.LevelLoaded -= LevelManagerOnLevelLoaded;
            LevelManager.LevelCompleted -= LevelManagerOnLevelCompleted;
            base.OnDisable();
        }

        private void LevelManagerOnLevelCompleted(ILevel level)
        {

        }

       


        private void LevelManagerOnLevelLoaded(ILevel level)
        {
            CurrentLevel = level.LevelNo;
//            _currentSymmetricCount = Board.CurrentSymmetricCount;
        }

        private IEnumerator Start()
        {
            Board = LevelManager.GameBoard;
            LevelManagerOnLevelLoaded(LevelManager.Level);

            yield return new WaitForEndOfFrame();
        }

        private void Update()
        {
//            CurrentSymmetricCount = Board.CurrentSymmetricCount;
            RefreshBtns();
        }


        private void OnClickNxt()
        {
            LevelManager.LoadLevel(LevelManager.Level.LevelNo + 1);
        }

        private void OnClickPrevious()
        {
            LevelManager.LoadLevel(LevelManager.Level.LevelNo - 1);
        }

        public void OnClickRestart()
        {
            LevelManager.LoadLevel(LevelManager.Level.LevelNo);
        }


        public void OnClickMore()
        {
            ShowingMoreContent = !ShowingMoreContent;
        }

        private IEnumerator MoreContentSizeAnim(float height)
        {
            while (Mathf.Abs(_moreContent.rect.height - height) > 1)
            {
                var h = Mathf.MoveTowards(_moreContent.rect.height, height, Time.deltaTime * 2500);
                _moreContent.sizeDelta = new Vector2(_moreContent.rect.width, h);
                yield return null;
            }

            _moreContent.sizeDelta = new Vector2(_moreContent.rect.width, height);
        }



        public void OnClickHome()
        {
            GameManager.LoadScene("Menu");
        }

        public void OnClickStore()
        {
            var storePanel = SharedUIManager.StorePanel;
            storePanel.Show();
        }


        public void OnClickHint()
        {
            if(Board.Completed || !Board.CanShowHintFurther)
                return;

            if (!ResourceManager.UnlimitedHints)
            {
                if (ResourceManager.Hints <= 0)
                {
                    //UIManager.Instance.StorePanel.Show();
                    return;
                }

                ResourceManager.Hints--;
            }
            
            Board.ShowHints();
        }

        public void OnClickUndo()
        {
            LevelManager.GameBoard.Undo();
        }




        private void RefreshBtns()
        {
            _previousBtn.interactable = !DisableButtons && LevelManager.Level.LevelNo > 1;
            _nxtBtn.interactable = !DisableButtons && ResourceManager.HasLevel(LevelManager.LevelGroup.id,LevelManager.Level.LevelNo+1)&&
                                   !ResourceManager.IsLevelLocked(LevelManager.LevelGroup.id,LevelManager.Level.LevelNo+1);
            _undoBtn.interactable =
                !DisableButtons  && LevelManager.GameBoard.HaveUndo;
        }

        public void TouchWatchAds()
        {
            string videoAdid = VideData.Instance.GetVide();
            TTSDK.TTRewardedVideoAd r = AdMgr.Instance.ShowVideoAdNew(videoAdid);
            Board.ShowHints();
            //创建激励视频关闭回调
            r.OnClose += (bol, val) =>
            {
                Debug.Log("关闭广告 ，是否已经看完" + bol);
                //看完广告获得提示
                if (bol)
                {
                    ResourceManager.Hints++;
                    Board.ShowHints();
                    MaidianNew.MaidianBackCallback(" ");
                    Debug.Log("广告看完");
                }
                else
                {
                    Debug.Log("广告未看完");
                }
            };

            //创建报错回调  
            r.OnError += (code, errorMessage) =>
            {

                Debug.Log("code:" + code + "错误信息：" + errorMessage);
            };

            //展示广告（新版本必须调用，不然无法展示出来广告）
            r.Show();

        }

    }
}